package ve.ucv.patologiaocular.showcase;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.interceptor.SessionAware;

import ve.ucv.patologiaocular.dao.MuestraDAO;
import ve.ucv.patologiaocular.dao.MuestraDAOImpl;
import ve.ucv.patologiaocular.domain.Muestra;
import ve.ucv.patologiaocular.util.ListaMuestra;
import com.opensymphony.xwork2.ActionSupport;

public class ListarMuestraPorSolicitud extends ActionSupport implements SessionAware {

	private static final long serialVersionUID = 2286989220431937267L;
	private static final Log log = LogFactory.getLog(ListarMuestraPorSolicitud.class);
	private MuestraDAO muestraDAO = null;
	private List<ListaMuestra> gridModel;
	private List<ListaMuestra> listaMuestras;
	private List<Muestra> muestras;
	private String codigo;
	private Integer rows = 0;
	private Integer page = 0;
	private Integer total = 0;
	private Integer records = 0;
	private boolean loadonce = false;
	private String nombre;
	private String descMacro;
	private Map<String, Object> session;
	
	public String execute() {
		log.debug("Page " + getPage()+" Rows " + getRows());
	    this.muestraDAO = new MuestraDAOImpl();
	    	    
	    if(nombre == null && descMacro == null){
	    	muestras = muestraDAO.listarMuestrasPorSolicitud(codigo);
	    	
	    	if(muestras.size() > 0){
	    		listaMuestras = new ArrayList<ListaMuestra>();
	    		
	    		for(Muestra m : muestras){
	    			listaMuestras.add(new ListaMuestra(m.getId(), m.getSolicitudId().getTipoSolicitud().concat("-").
	    					concat(m.getSolicitudId().getCodigo()).concat("-").concat(m.getSolicitudId().getAno()),
	    					m.getNombre(), m.getDescMacro()));
	    		}
	    	}
	    }
	    else{
	    	codigo = getSession().get("codigo").toString();
	    	muestras = muestraDAO.buscarMuestra(codigo, nombre, descMacro);
	    	if(muestras.size() > 0){
	    		listaMuestras = new ArrayList<ListaMuestra>();
	    		
	    		for(Muestra m : muestras){
	    			listaMuestras.add(new ListaMuestra(m.getId(), m.getSolicitudId().getTipoSolicitud().concat("-").
	    					concat(m.getSolicitudId().getCodigo()).concat("-").concat(m.getSolicitudId().getAno()),
	    					m.getNombre(), m.getDescMacro()));
	    		}
	    	}
	    }
	    /*else{
	    	muestras = muestraDAO.listarMuestras();
	    	
	    	if(muestras.size() > 0){
	    		listaMuestras = new ArrayList<ListaMuestra>();
	    		
	    		for(Muestra m : muestras){
	    			listaMuestras.add(new ListaMuestra(m.getId(), m.getSolicitudId().getTipoSolicitud().concat("-").
	    					concat(m.getSolicitudId().getCodigo()), m.getNombre(), m.getDescMacro()));
	    		}
	    	}
	    	else{
	    		addActionError("No hay muestras registradas.");
	    		return ERROR;
	    	}
	    }*/
	    
	    if(muestras.size() == 0){
	    	setRecords(0);
	    }
	    else{
	    	setRecords(listaMuestras.size());
	    }

	    int to = (getRows() * getPage());
	    int from = to - getRows();

	    if (to > getRecords()) to = getRecords();

	    if (loadonce)
	    {
	    	if(muestras.size() == 0){
	    		setGridModel(null);
		    }
		    else{
		    	setGridModel(listaMuestras);
		    }
	    }
	    else
	    {
	    	if(muestras.size() == 0){
	    		setGridModel(null);
		    }
		    else{
	    		setGridModel(listaMuestras.subList(from, to));
		    }
	    }
	    
	    setTotal((int) Math.ceil((double) getRecords() / (double) getRows()));
		
		return SUCCESS;
	}
	
	public String getJSON()
	{
	    return execute();
	}

	public MuestraDAO getMuestraDAO() {
		return muestraDAO;
	}

	public void setMuestraDAO(MuestraDAO muestraDAO) {
		this.muestraDAO = muestraDAO;
	}

	public List<ListaMuestra> getGridModel() {
		return gridModel;
	}

	public void setGridModel(List<ListaMuestra> gridModel) {
		this.gridModel = gridModel;
	}

	public List<ListaMuestra> getListaMuestras() {
		return listaMuestras;
	}

	public void setListaMuestras(List<ListaMuestra> listaMuestras) {
		this.listaMuestras = listaMuestras;
	}

	public List<Muestra> getMuestras() {
		return muestras;
	}

	public void setMuestras(List<Muestra> muestras) {
		this.muestras = muestras;
	}

	public String getCodigo() {
		return codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public Integer getRows() {
		return rows;
	}

	public void setRows(Integer rows) {
		this.rows = rows;
	}

	public Integer getPage() {
		return page;
	}

	public void setPage(Integer page) {
		this.page = page;
	}

	public Integer getTotal() {
		return total;
	}

	public void setTotal(Integer total) {
		this.total = total;
	}

	public Integer getRecords() {
		return records;
	}

	public void setRecords(Integer records) {
		this.records = records;
		
		if (this.records > 0 && this.rows > 0)
	    {
	      this.total = (int) Math.ceil((double) this.records / (double) this.rows);
	    }
	    else
	    {
	      this.total = 0;
	    }
	}

	public boolean isLoadonce() {
		return loadonce;
	}

	public void setLoadonce(boolean loadonce) {
		this.loadonce = loadonce;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	
	public String getDescMacro() {
		return descMacro;
	}

	public void setDescMacro(String descMacro) {
		this.descMacro = descMacro;
	}

	public Map<String, Object> getSession() {
		return session;
	}
	
	public void setSession(Map<String, Object> session) {
		this.session = session;
	}
}
